gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:15:22 26 4
gpt4 key购买 nike

我正在尝试通过在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com