草庐IT

android - Android 应用通过 post 发送的参数在 Go 语言编写的后端服务器上始终为空

coder 2024-07-08 原文

我正在尝试通过在 Android 应用程序中使用 SendUserIdTokenToBackend() 方法来发布 token 。

private class SendUserIdTokenToBackend extends AsyncTask<String, Void, String> {

    private Exception exception;

    @Override
    protected String doInBackground(String... idToken) {
        Log.d(TAG, "idToken" + idToken);
        try {
            List<Pair> params = new ArrayList<Pair>();
            Pair<String, String> pair = Pair.create("idToken", idToken[0]);
            params.add(pair);
            String paramString = getQuery(params);

            URL url = new URL("http://itforhr.com/webservice/android-sign-in");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");

            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();

            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));

            writer.write(paramString);

            writer.flush();
            writer.close();
            os.close();

            Log.d(TAG, "getQuery:" + paramString);


            conn.connect();

            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder stringBuilder = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                stringBuilder.append(line + "\n");
            }

            return stringBuilder.toString();


        } catch (Exception e) {

            return  "Error sending ID token to backend. " + e.toString();
        }
    }

    @Override
    protected void onPostExecute(String result) {


        mIdTokenTextView.setText(getString(R.string.id_token_fmt, result));
    }
}


private String getQuery(List<Pair> params) throws UnsupportedEncodingException
{
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (Pair pair : params)
    {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.first.toString(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.second.toString(), "UTF-8"));
    }

    return result.toString();
}

Log.d 结果没问题。我在日志中看到正确打印的 token ID。

但是在服务器端,我无法获取idToken参数

    func init() {
        http.HandleFunc("/webservice/android-sign-in/", androidSignInHandler)
    }

    func androidSignInHandler(w http.ResponseWriter, r *http.Request) {

        log.Println("(-------- Entering androidSignInHandler --------)")

        ctx := appengine.NewContext(r)

        idToken := r.FormValue("idToken")

        client := urlfetch.Client(ctx)
        _, err := client.Get("https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=" + idToken)

        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        } else {

            w.Header().Set("Content-Type", "text/html")

            fmt.Fprintf(w, "%v and %v", r.PostForm, idToken)

        }

        log.Println("(-------- Exiting androidSignInHandler --------)")

    }

fmt 打印出“map[] and”,idToken 为空。我尝试在获取 idToken 参数之前调用 parseForm() 但它没有用。我已经被困在这里两个晚上了。请帮忙。

最佳答案

看起来 go 中的处理程序应该可以工作,而且 java 代码应该发送正确的请求。通常在这些情况下,单独测试部件很有用。

测试服务器的一种方法是使用curl向服务器发送请求,如

curl -v --data "idToken=theToken" http://itforhr.com/webservice/android-sign-in

然后检查是否有效。如果有效,那么您就知道问题出在客户端,如果无效,则可能是在服务器端。

您可以通过读取正文而不解析它来进一步检查服务器实际接收到的内容:

b, _ := ioutil.ReadAll(r.Body)
fmt.Print(string(b))

或者解析后转储:

r.ParseForm()
fmt.Printf("%#v", r.Form)

我希望这可以帮助您了解问题出在哪里。

关于android - Android 应用通过 post 发送的参数在 Go 语言编写的后端服务器上始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846002/

有关android - Android 应用通过 post 发送的参数在 Go 语言编写的后端服务器上始终为空的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  10. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

随机推荐